<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ECMAScript 保留字 位运算</title>
    <script>

        // 主要测试Js中的位运算 
        /*
        位运算 NOT
        位运算 NOT 由否定号（~）表示，它是 ECMAScript 中为数不多的与二进制算术有关的运算符之一。
        位运算 NOT 是三步的处理过程：
        把运算数转换成 32 位数字
        把二进制数转换成它的二进制反码
        把二进制数转换成浮点数
        */
        function testNot(){
            var iNum1 = 25;		//25 等于 00000000000000000000000000011001
            var iNum2 = ~iNum1;	//转换为 11111111111111111111111111100110
            alert(iNum2);		//输出 "-26"
        }

        /*
        位运算 AND
        位运算 AND 由和号（&）表示，直接对数字的二进制形式进行运算。它把每个数字中的数位对齐，
        然后用下面的规则对同一位置上的两个数位进行 AND 运算：  和 not 一样每个一位包括符号位每位按位与  
        */
        function testAnd(){
            var iResult = 25 & 3;
            alert(iResult);	//输出 "1" 
            /*
           25 = 0000 0000 0000 0000 0000 0000 0001 1001
            3 = 0000 0000 0000 0000 0000 0000 0000 0011
            ---------------------------------------------
            AND = 0000 0000 0000 0000 0000 0000 0000 0001
            */
        }

        /*
        位运算 XOR  异或运算 
        位运算 XOR 由符号（^）表示，当然，也是直接对二进制形式进行运算。XOR 不同于 OR，
        当只有一个数位存放的是 1 时，它才返回 1。也就是 1 1 得 0 ； 0 0 得 0  只有 1，0 或者 0，1 得 1
        */
        function testXOR(){

            var iResult = 25 ^ 3;
            alert(iResult);
        }

        /*
        位运算 或 |
        */
        function testOR(){
            var iResult = 25 | 3;
            alert(iResult);
        }

        /*
        有符号位数字 左移运算  移动运算不 移动符号位  
        左移运算由两个小于号表示（<<）。它把数字中的所有数位向左移动指定的数量。例如，
        把数字 2（等于二进制中的 10）左移 5 位，结果为 64（等于二进制中的 1000000）：
        */
        function moveLeft(){
            var iOld = 2;		//等于二进制 10
            var iNew = iOld << 5;	//等于二进制 1000000 十进制 64
        }

        /*
        有符号位数字 右移运算  
        */
        function moveRight(){
            var iOld = 64;		//等于二进制 1000000
            var iNew = iOld >> 5;	//等于二进制 10 十进制 2
        }

        /*
        无符号位数字右移动运算还是有区别的    
        无符号右移运算用 0 填充所有空位。对于正数，这与有符号右移运算的操作一样，而负数则被作为正数来处理。
        但是 JS 中默认所有的数字都是有符号的 所以我们要做特殊处理 
        */
        function moveRightNoSymble(){
            var iOld = 64;		//等于二进制 1000000
            var iNew = iOld >>> 5;	//等于二进制 10 十进制 2
        }

        function moveRightTwo(){
            // 要实现这一点，需要把这个数字转换成无符号的等价形式（尽管该数字本身还是有符号的），可以通过以下代码获得这种形式：
            var iUnsigned64 = -64 >>> 0;
            alert(iUnsigned64.toString(2));
        }

    </script>
</head>
<body>
    
</body>
</html>